import os
import sys
import logging
import argparse
import tkinter as tk
from duplicate_detector.duplicate_detector import DuplicateDetector
from config_manager.config_manager import ConfigManager
from ui.main_window import DuplicateFileFinderUI


def setup_logging(log_level: str) -> None:
    """
    设置日志系统
    :param log_level: 日志级别
    """
    level_map = {
        'debug': logging.DEBUG,
        'info': logging.INFO,
        'warning': logging.WARNING,
        'error': logging.ERROR,
        'critical': logging.CRITICAL
    }
    logging.basicConfig(
        level=level_map.get(log_level, logging.INFO),
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    )


def main() -> None:
    """
    主函数，处理命令行参数并执行相应功能
    """
    # 创建配置管理器
    config_manager = ConfigManager('config.json')
    config_manager.load_config()
    config = config_manager.get_config()

    # 设置日志
    setup_logging(config['log_level'])
    logger = logging.getLogger(__name__)

    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='重复文件查找工具')
    parser.add_argument('directory', nargs='?', default=os.getcwd(), help='要扫描的目录 (默认: 当前目录)')
    parser.add_argument('-d', '--depth', help="扫描深度 ('recursive', 'shallow' 或非负整数, 默认: {})".format(config['scan_depth']))
    parser.add_argument('-a', '--algorithm', help="哈希算法 ('md5' 或 'sha1', 默认: {})".format(config['hash_algorithm']))
    parser.add_argument('-s', '--sort', help="排序依据 ('modified_time', 'created_time', 'accessed_time', 'size', 'name', 默认: {})".format(config['sort_by']))
    parser.add_argument('-o', '--order', help="排序顺序 ('ascending' 或 'descending', 默认: {})".format(config['sort_order']))
    parser.add_argument('-e', '--show-empty', action='store_true', help='显示空文件 (默认: 不显示)')
    parser.add_argument('-n', '--no-confirm', action='store_true', help='删除文件时不需要确认 (默认: 需要确认)')
    parser.add_argument('--save-config', action='store_true', help='保存当前命令行参数为默认配置')
    parser.add_argument('--ui', action='store_true', help='启动图形用户界面 (已废弃，GUI为默认模式)')
    parser.add_argument('--cli', action='store_true', help='启动命令行界面')

    args = parser.parse_args()

    # 更新配置（如果提供了命令行参数）
    update_config = {}
    if args.depth:
        if args.depth == 'recursive' or args.depth == 'shallow':
            update_config['scan_depth'] = args.depth
        else:
            try:
                update_config['scan_depth'] = int(args.depth)
                if update_config['scan_depth'] < 0:
                    logger.error('扫描深度必须是非负整数')
                    return
            except ValueError:
                logger.error('扫描深度必须是"recursive"、"shallow"或非负整数')
                return
    if args.algorithm:
        update_config['hash_algorithm'] = args.algorithm
    if args.sort:
        update_config['sort_by'] = args.sort
    if args.order:
        update_config['sort_order'] = args.order
    if args.show_empty:
        update_config['show_empty_files'] = True
    if args.no_confirm:
        update_config['delete_confirmation'] = False

    # 应用配置更新
    errors = config_manager.set_many(update_config)
    if errors:
        logger.warning(f'配置更新错误: {errors}')

    # 保存配置（如果需要）
    if args.save_config:
        if config_manager.save_config():
            logger.info('配置已保存')
        else:
            logger.error('保存配置失败')

    # 获取更新后的配置
    config = config_manager.get_config()

    # 显示当前配置
    logger.info(f'当前配置: {config}')

    # 检查是否启动命令行模式
    if args.cli:
        # 命令行模式：继续执行原有逻辑
        pass
    else:
        # 默认启动GUI模式（除非明确指定--cli）
        logger.info('启动图形用户界面...')
        root = tk.Tk()
        app = DuplicateFileFinderUI(root)
        root.mainloop()
        return

    # 以下为命令行模式的逻辑

    # 检查目录是否存在
    if not os.path.isdir(args.directory):
        logger.error(f'目录不存在: {args.directory}')
        return

    # 创建重复文件检测器
    detector = DuplicateDetector(
        scan_depth=config['scan_depth'],
        hash_algorithm=config['hash_algorithm'],
        sort_by=config['sort_by'],
        sort_order=config['sort_order'],
        show_empty_files=config['show_empty_files']
    )

    # 扫描目录
    logger.info(f'开始扫描目录: {args.directory}')
    duplicate_groups = detector.scan_directory(args.directory)

    # 显示结果
    if not duplicate_groups:
        logger.info('未找到重复文件')
        return

    logger.info(f'找到 {len(duplicate_groups)} 组重复文件')
    
    # 显示重复文件详情
    for i, group in enumerate(duplicate_groups, 1):
        print(f'\n重复组 {i} ({len(group)} 个文件):')
        for file_info in group:
            size_mb = file_info['size'] / (1024 * 1024)
            print(f'  - {file_info["path"]} ({size_mb:.2f} MB)')

    # 询问是否删除重复文件
    if config['delete_confirmation']:
        response = input('是否删除重复文件? (y/n): ')
        if response.lower() == 'y':
            detector.delete_duplicates(duplicate_groups)
    else:
        detector.delete_duplicates(duplicate_groups)


if __name__ == '__main__':
    main()